public class question28 {
}
//方法一 单向遍历发
//class Solution28 {
//    public int removeElement(int[] nums, int val) {
//        int sum=0;//用来记录从0到当前位置已有val的数量
//        for (int i = 0; i < nums.length; i++) {
//            if(nums[i]==val){
//                sum++;
//                continue;//当前如果是val值则不执行后面的操作，等后面不是val的值将其覆盖
//            }
//            nums[i-sum]=nums[i];//往前移动sum个位置，用于覆盖前面出现过的val
//        }
//        return nums.length-sum;
//    }
//}
//方法二 双指针法
class Solution28 {
    public int removeElement(int[] nums, int val) {
        //双指针方法一(我的写法)
//        int l =0,r=nums.length-1;//定义两个指针，一个从左到右，一个从右到左
//        while(l<=r){
//            if(nums[l]==val){//进来就以意味着当前的nums[l]是val，需要改变
//                if(l==r){
//                    break;
//                }
//                while(true){
//                    if(nums[r]!=val){
//                        nums[l]=nums[r];
//                        r--;
//                        break;
//                    }
//                    r--;
//                }
//            }
//            if(nums[l]==val)//说明右指针指向的数也全是val了，所以就提前退出了
//                break;
//            l++;
//        }
//        return l;//l就表示有效数组的长度

        //双指针方法二（别人的解法）
        if(nums==null||nums.length==0)
            return 0;
        int l=0,r=nums.length-1;
        while(l<r){
            while(l<r&&nums[l]!=val){
                l++;
            }
            while(l<r&&nums[r]==val){
                r--;
            }
            int temp;
            temp=nums[l];
            nums[l]=nums[r];
            nums[r]=temp;
        }
        return nums[l]==val?l:l+1;
    }
}
